package main

import "fmt"

func main() {
	//案例：
	//请编写一个程序，该程序可以接收一个字符，比如：a,b,c,d,e,f,g
	//a表示星期一，b表示星期二，根据用户的输入显示相依的信息
	//要求使用switch语句完成

	//分析思路
	//1、定义一个变量接收字符
	//2、使用switch完成
	var key byte
	fmt.Println("请输入一个字符a,b,c,d,e,f,g")
	fmt.Scanf("%c", &key)

	//细节：
	//1、switch分支不需要break，匹配到执行代码块，执行完退出switch
	//2、case后面可以有多个表达式，用逗号隔开
	//3、后面接的表达式可以是常量，变量，带返回值的函数等
	//4、case后的各个表达式的值的数据类型要与switch后的表达式的数据类型一致
	//5、case后面表达式如果是常量值，则要求不能重复
	//6、default语句不是必须的
	//7、switch后也可以不带表达式，类似if---else分支来使用
	switch key {
	case 'a':
		fmt.Println("周一")
	case 'b':
		fmt.Println("周二")
	case 'c':
		fmt.Println("周三")
	//...
	default:
		fmt.Println("输入有误...")
	}

	var age int = 10
	switch {
	case age == 10:
		fmt.Println("age==10")
	case age == 20:
		fmt.Println("age==20")
	default:
		fmt.Println("没有匹配到")
	}

	//8、case中可以对范围进行判断
	var score int = 90
	switch {
	case score > 90:
		fmt.Println("成绩优秀")
	case score >= 70 && score <= 90:
		fmt.Println("成绩优良")
	case score >= 60 && score < 70:
		fmt.Println("成绩及格")
	default:
		fmt.Println("不及格")
	}

	//9、switch后也可以直接声明/定义一个变量，分号结束，不推荐
	switch grade := 90; {
	case grade > 90:
		fmt.Println("成绩优秀")
	case grade >= 70 && grade <= 90:
		fmt.Println("成绩优良")
	case grade >= 60 && grade < 70:
		fmt.Println("成绩及格")
	default:
		fmt.Println("不及格")
	}

	//10、switch穿透 - fallthrough，如果在case语句块后增加fallthrough，则会继续执行下一个case，也叫switch穿透
	var num int = 10
	switch num {
	case 10:
		fmt.Println("ok1")
		fallthrough //默认只能穿透一层
	case 20:
		fmt.Println("ok2")
	case 30:
		fmt.Println("ok3")
	default:
		fmt.Println("没有匹配到")

	}
	//11、Type Switch：switch语句还可以被用于type-switch来判断某个interface变量中实际指向的变量类型
	var x interface{}
	var y = 10.0
	x = y
	switch i := x.(type) {
	case nil:
		fmt.Printf("x的类型%T\n", i)
	case int:
		fmt.Println("x是int型")
	case float64:
		fmt.Println("x是float64型")
	case func(int) float64:
		fmt.Println("x是func(int)型")
	case bool, string:
		fmt.Println("x是bool或string型")
	default:
		fmt.Printf("未知型")

	}
}
